#include "song.h"
#include <QUuid>
#include <QMediaPlayer>
#include <QCoreApplication>
#include <QUuid>

Song::Song()
    :isLike(false),
     isHistory(false)
{}

Song::Song(const QUrl &url)
    :isLike(false),
     isHistory(false),
     musicUrl(url)
{
    musicId = QUuid::createUuid().toString();
    parseMediaMetaData();
}

void Song::setIsLike(bool islike)
{
    this->isLike = islike;
}

void Song::setHistory(bool isHistory)
{
    this->isHistory = isHistory;
}

void Song::setMusicName(const QString &musicname)
{
    this->musicName = musicname;
}

void Song::setMusicSingerName(const QString &singername)
{
    this->singerName = singername;
}

void Song::setAlbumName(const QString &albumname)
{
    this->albumName = albumname;
}

void Song::setDuration(const qint64 &duration)
{
    this->Duration = duration;
}

void Song::setMusicUrl(const QUrl &url)
{
    this->musicUrl = url;
}

void Song::setMusicId(const QString &musicid)
{
    this->musicId = musicid;
}

bool Song::getIsLike()
{
    return isLike;
}

bool Song::getIsHistory()
{
    return isHistory;
}

QString Song::getMusicName()
{
    return musicName;
}

QString Song::getSingerName()
{
    return singerName;
}

QString Song::getAlbumName()
{
    return albumName;
}

qint64 Song::getDuration()
{
    return Duration;
}

QUrl Song::getMusicUrl()
{
    return musicUrl;
}

QString Song::getMusicId()
{
    return musicId;
}

QString Song::getLrcFilePath() const
{
    // ⾳频⽂件和LRC⽂件在⼀个⽂件夹下
    // 直接将⾳频⽂件的后缀替换为.lrc
    QString path = musicUrl.toLocalFile();
//    qDebug() << path;
    path.replace(".mp3",".lrc");
    path.replace(".flac",".lrc");
    path.replace(".mpga",".lrc");
//    qDebug() << path << endl;
    return path;
}

void Song::insertMusicToDB()
{
    // 1. 检测music是否在数据库中存在
    QSqlQuery query;
    // 当SELECT 1...查询到结果后，我们需要知道是否存在
    // SELECT EXISTS(⼦查询) ： ⼦查询中如果有记录，SELECT EXISTS返回TRUE
    // 如果⼦查询中没有满⾜条件的记录， SELECT EXISTS返回FALSE
    query.prepare("SELECT EXISTS (SELECT 1 FROM MusicInfo WHERE musicId = ?)");
    query.addBindValue(musicId);
    if(!query.exec())
    {
        qDebug()<<"查询失败: "<<query.lastError().text();
        return;
    }

    if(query.next())
    {
        bool isExists = query.value(0).toBool();
        if(isExists)
        {
            // musicId的歌曲已经存在
            // 2. 存在：不需要再插⼊musci对象，此时只需要将isLike和isHistory属性进⾏更新
            query.prepare("UPDATE MusicInfo SET isLike = ?, isHistory = ? WHERE musicId = ?");
            query.addBindValue(isLike ? 1 : 0);
            query.addBindValue(isHistory ? 1 : 0);
            query.addBindValue(musicId);
            if(!query.exec())
            {
                qDebug()<<"更新失败: "<<query.lastError().text();
            }
            qDebug()<<"更新music信息: "<<musicName<<" "<<musicId;
        }
        else
        {
            // 3. 不存在：直接将music的属性信息插⼊数据库
            query.prepare("INSERT INTO MusicInfo(musicId, musicName,\
                          musicSinger, albumName, musicUrl,\
                          duration, isLike, isHistory)\
                          VALUES(?,?,?,?,?,?,?,?)");
            query.addBindValue(musicId);
            query.addBindValue(musicName);
            query.addBindValue(singerName);
            query.addBindValue(albumName);
            query.addBindValue(musicUrl.toLocalFile());
            query.addBindValue(Duration);
            query.addBindValue(isLike ? 1 : 0);
            query.addBindValue(isHistory ? 1 : 0);

            if(!query.exec())
            {
                qDebug()<<"插⼊失败: "<<query.lastError().text();
                return;
            }
            qDebug()<<"插⼊music信息: "<<musicName<<" "<<musicId << " " << musicUrl;
        }
    }
}

void Song::plainMsg()
{
    qDebug() << getMusicId() << getMusicUrl() << getMusicName() << getSingerName();
}


//在Music的构造函数中调⽤，当创建⾳乐对象时，顺便完成歌曲⽂件的加载
void Song::parseMediaMetaData()
{
    // 解析时候需要读取歌曲数据，读取歌曲⽂件需要⽤到QMediaPlayer类
    QMediaPlayer player;

     // 2. 设置媒体源，依靠setMedia方法解析元数据
    player.setMedia(musicUrl);

    // 媒体元数据解析需要时间，只有等待解析完成之后，才能提取⾳乐信息，此处循环等待
    // 循环等待时：主界⾯消息循环就⽆法处理了，因此需要在等待解析期间，让消息循环继续处理
    while(!player.isMetaDataAvailable())
    {
        QCoreApplication::processEvents();
    }

    // 解析媒体元数据结束，提取元数据信息
    if(player.isMetaDataAvailable())
    {
        musicName = player.metaData("Title").toString();
        singerName = player.metaData("Author").toString();
        albumName = player.metaData("AlbumTitle").toString();
        Duration = player.duration();

        QString filename = musicUrl.fileName();
        // 找-的位置
        int index = filename.indexOf('-');

        if(musicName.isEmpty())
        {
            if(index != -1)
            {
                // "2002年的第一场雪 - 刀郎.mp3"
                musicName = filename.mid(0,index).trimmed();
            }
            else
            {
                // "2002年的第一场雪.mp3"
                musicName = filename.mid(0, filename.indexOf('.')).trimmed();
            }
//            musicName = "歌曲未知";
        }

        if(singerName.isEmpty())
        {
            if(index != -1)
            {
                singerName = filename.mid(index+1,filename.indexOf('.')-index-1).trimmed();
            }
            else
            {
                singerName = "歌手未知";
            }

        }

        if(albumName.isEmpty())
        {
            albumName = "专辑名未知";
        }

        qDebug() << musicName << " " << singerName << " " << albumName << " " << Duration;
    }
}


